/**
 * 主进程中的网站信息获取工具
 * 用于获取网站的标题和图标，避免跨域问题
 */
import { net } from 'electron'

/**
 * 网站信息接口
 */
export interface SiteInfo {
  title: string
  favicon: string
  url: string // 最终的URL（可能与原始URL不同，如重定向后的URL）
}

/**
 * 网站HTML获取结果接口
 */
interface FetchResult {
  html: string
  finalUrl: string
}

/**
 * 通过主进程获取网站HTML内容
 */
export async function fetchSiteHtml(url: string): Promise<FetchResult> {
  return new Promise((resolve, reject) => {
    let currentUrl = url

    const request = net.request({
      method: 'GET',
      url,
      headers: {
        'User-Agent':
          'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
      }
    })

    let responseData = ''

    // 监听重定向事件以跟踪最终URL
    request.on('redirect', (statusCode, method, redirectUrl) => {
      currentUrl = redirectUrl
      console.log(`重定向到: ${redirectUrl}`)
      request.followRedirect()
    })

    request.on('response', response => {
      if (response.statusCode !== 200) {
        reject(new Error(`HTTP ${response.statusCode}`))
        return
      }

      response.on('data', chunk => {
        responseData += chunk.toString()
      })

      response.on('end', () => {
        clearTimeout(timeout)
        resolve({
          html: responseData,
          finalUrl: currentUrl
        })
      })

      response.on('error', error => {
        clearTimeout(timeout)
        reject(error)
      })
    })

    request.on('error', error => {
      clearTimeout(timeout)
      reject(error)
    })

    // 设置超时
    const timeout = setTimeout(() => {
      request.abort()
      reject(new Error('请求超时'))
    }, 10_000)

    request.end()
  })
}

/**
 * 解析HTML获取title和favicon
 */
export function parseSiteInfo(html: string, url: string): SiteInfo {
  try {
    // 使用正则表达式解析title
    const titleMatch = html.match(/<title[^>]*>([^<]*)<\/title>/i)
    const title = titleMatch ? titleMatch[1].trim() : new URL(url).hostname

    // 解析favicon
    let favicon = ''

    // 尝试多种favicon选择器
    const faviconPatterns = [
      /<link[^>]*rel=["']icon["'][^>]*href=["']([^"']+)["'][^>]*>/i,
      /<link[^>]*href=["']([^"']+)["'][^>]*rel=["']icon["'][^>]*>/i,
      /<link[^>]*rel=["']shortcut icon["'][^>]*href=["']([^"']+)["'][^>]*>/i,
      /<link[^>]*href=["']([^"']+)["'][^>]*rel=["']shortcut icon["'][^>]*>/i,
      /<link[^>]*rel=["']apple-touch-icon["'][^>]*href=["']([^"']+)["'][^>]*>/i,
      /<link[^>]*href=["']([^"']+)["'][^>]*rel=["']apple-touch-icon["'][^>]*>/i
    ]

    for (const pattern of faviconPatterns) {
      const match = html.match(pattern)
      if (match && match[1]) {
        favicon = match[1]
        break
      }
    }

    // 处理相对路径
    if (favicon) {
      if (favicon.startsWith('//')) {
        // 协议相对路径
        const urlObj = new URL(url)
        favicon = `${urlObj.protocol}${favicon}`
      } else if (favicon.startsWith('/')) {
        // 绝对路径
        const urlObj = new URL(url)
        favicon = `${urlObj.protocol}//${urlObj.host}${favicon}`
      } else if (!favicon.startsWith('http')) {
        // 相对路径
        const urlObj = new URL(url)
        favicon = `${urlObj.protocol}//${urlObj.host}/${favicon}`
      }
    } else {
      // 如果没有找到favicon，使用默认路径
      const urlObj = new URL(url)
      favicon = `${urlObj.protocol}//${urlObj.host}/favicon.ico`
    }

    return {
      title,
      favicon,
      url
    }
  } catch (error) {
    console.error('解析网站信息失败:', error)
    const urlObj = new URL(url)
    return {
      title: urlObj.hostname,
      favicon: `${urlObj.protocol}//${urlObj.host}/favicon.ico`,
      url
    }
  }
}

/**
 * 获取网站信息的主要方法
 * 如果获取失败则抛出错误
 */
export async function fetchSiteInfo(url: string): Promise<SiteInfo> {
  console.log('主进程开始获取网站信息:', url)

  // 获取HTML内容和最终URL
  const { html, finalUrl } = await fetchSiteHtml(url)

  // 解析网站信息，使用最终URL
  const siteInfo = parseSiteInfo(html, finalUrl)

  console.log('主进程获取网站信息成功:', siteInfo)
  console.log('原始URL:', url, '最终URL:', finalUrl)
  return siteInfo
}
